<?php
/* Classe tem a capacidade de manter acoplado uma intancia a sua classe após armazenagem em uma session
 * Aplicável apenas em Zend_Db_Table_Rowset_Abstract e Zend_Db_Table_Row_Abstract
 */
class Arm_Session_Namespace extends Zend_Session_Namespace{

    public function & __get($name){
        $data = parent::__get($name);

        if(is_array($data)){
            
            if(array_key_exists('type', $data) and array_key_exists('table', $data)){
                
                $table = new $data['table'];

                if($data['type'] == 'rowset'){
                        
                    $class = $table->getRowsetClass();
                
                    $data  = array(
                        'table'    => $table,
                        'data'     => $data['values'],
                        'rowClass' => $table->getRowClass(),
                        'stored'   => true
                    );

                }elseif($data['type'] == 'row'){

                   $class = $table->getRowClass();
                   $data  = array(
                       'table'       => $table,
                       'data'        => $data['values'],
                       'rowsetClass' => $table->getRowsetClass(),
                       'stored'      => true
                   );
                }
                $class = new $class($data);
                return $class;
            }
        }
        return $data;
    }

    public function __set($name, $value){

        if($value instanceof Zend_Db_Table_Rowset_Abstract){
       
            $data = array(
                'table'  => get_class($value->getTable()),
                'values' => $value->toArray(),
                'type'   => 'rowset'
            );
            parent::__set($name, $data);

        }elseif($value instanceof Zend_Db_Table_Row_Abstract){

            $data = array(
                'table'  => get_class($value->getTable()),
                'values' => $value->toArray(),
                'type'   => 'row'
            );
            parent::__set($name, $data);

        }else{
            
            parent::__set($name, $value);
        }
    }
}
